CloudFormation で S3 バケット作成後、スタックの削除時に「The bucket you tried to delete is not empty. You must delete all versions in the bucket.」が表示されて DELETE_FAILED になる場合の対処方法
困っていた内容
CloudFormation で S3 バケットを作成しました。用事が済んだため対象スタックを削除しようとしたら、The bucket you tried to delete is not empty. You must delete all versions in the bucket.
というエラーが発生し、スタックのステータスが DELETE_FAILED となって削除が完了しません。対処方法を教えてください。
どう対応すればいいの?
バージョニングが有効化されている S3 バケット内にオブジェクトが一つ以上存在していることで S3 バケットが削除できずに当該エラーが発生しています。
対応方法については、下記の 4通りが考えられます。
① Amazon S3 コンソールから削除する
② AWS SDK を使用して削除する
③ ライフサイクルルールを使用して削除する
④ カスタムリソースを使用する
以下にてそれぞれの対応方法について記載いたします。
① Amazon S3 コンソールから削除する
一番簡単に実施できるのがこの手順です。S3 バケット内に少数のオブジェクトが存在している場合にはこちらがお勧めです。
S3 コンソールにアクセス後、対象バケット名の左のチェックボックスを選択した状態で「空にする」をクリックします。
完全に削除 と入力して「空にする」をクリックします。
バージョニングの表示をオンにしても、オブジェクトが存在しない状態になりました。
バケットの中身が空になったため、再度スタックの削除を実施してください。
② AWS SDK を使用して削除する
AWS SDK を使用して S3 バケットの中身を空にすることもできます。今回は python を使用して実行します。
参考 URL より以下の python コードを test.py
という名前で保存します。
#!/usr/bin/env python BUCKET = 'your-bucket-here' #バケット名を指定する import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET) bucket.object_versions.delete()
python3 および pip がインストールされた環境で以下のコマンドを実行して Boto3 をインストールします。
$ pip install boto3
python3 コマンドで test.py
ファイルを実行します。
$ python3 test.py
list-object-versions コマンドを実行して何も返却されないことを確認します。
$ aws s3api list-object-versions --bucket your-bucket-here
そして最後にスタックの削除を実施してください。
③ ライフサイクルルールを使用して削除する
S3 バケット内に大量のオブジェクトが存在する場合、日数はかかってしまいますがライフサイクルルールを使用してバケットの中身を空にすることをお勧めします。
S3 コンソールにアクセス後に対象バケットを選択して管理タブを開き、「ライフサイクルルールを作成する」をクリックします。
ライフサイクルルール名を入力し、「バケット内の全てのオブジェクトに適用」を選択して注意事項にチェックマークを入れます。そして以下の3つのアクションにチェックマークを入れます。
- オブジェクトの現行バージョンを有効期限切れにする
- オブジェクトの非現行バージョンを完全に削除
- 有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除
上記に選択したアクションに応じた日数の指定が求められますので以下の通り記入した後に「ルールの作成」をクリックします。
- 「オブジェクト作成後の日数」に 1 を指定
- 「オブジェクトが現行バージョンでなくなってからの日数」に 1 を指定
- 「不完全なマルチパートアップロードを削除」を選択して「日数」に 1 を指定
次に 2つ目のライフサイクルルールを作成します。
先ほどと同様にライフサイクルルール名を入力し、「バケット内の全てのオブジェクトに適用」を選択して注意事項にチェックマークを入れます。
次に「有効期限切れのオブジェクト削除マーカーまたは不完全なマルチパートアップロードを削除」にチェックマークを入れます。
「期限切れのオブジェクト削除マーカーを削除する」を選択して「ルールの作成」をクリックします。
オブジェクトが全て削除されたことが確認できたら、スタックの削除を実施してください。
④ カスタムリソースを使用する
Lambda を使用したカスタムリソースを CloudFormation で定義することで、スタックを削除する際に S3 バケットと一緒にオブジェクトも削除するように設定することができます。
以下の記事にて設定方法をご案内しておりますのでご参照ください。